//
//  LGControllerManager.h
//  ALS-02
//
//  Created by guomianxiang on 16/11/9.
//  Copyright © 2016年 guomianxiang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "LGController.h"
#import "LGDoor.h"
#import "LGtools.h"

#define DCMI [LGControllerManager shareControllerManager]

#define LG_DEPRECATED(presentation) NS_DEPRECATED(5_0,5_0,5_0,5_0, presentation)

/**
 门禁控制器管理类 发生错误枚举

 - LGControllerManagerErrorExisted: 该item已经存在
 - LGControllerManagerErrorNotExist: 该item不存在
 - LGControllerManagerErrorSaveFailed: 保存失败
 */
typedef NS_OPTIONS(NSUInteger, LGControllerManagerError) {
    LGControllerManagerErrorExisted = 0,
    LGControllerManagerErrorNotExist = 1,
    LGControllerManagerErrorSaveFailed = 2
};


@interface LGControllerManager : NSObject
///<NSCopying,NSMutableCopying>

/**
 控制器数组
 */
@property (strong, readonly, nonatomic, nullable) NSArray <LGController *>* controllers;

/**
 门数组
 */
@property (strong, readonly, nonatomic, nullable) NSArray <LGDoor *>* doors;

/**
 门数组，按首字母排序
 */
@property (strong, readonly, nonatomic, nullable) NSArray <NSArray <LGDoor *>*>*letterOrderDoors;

/**
 门数组，按用户使用频率排序
 */
@property (strong, readonly, nonatomic, nullable) NSArray <LGDoor *>*usefulFrequencyOrderDoors;
//--------------------------------------------

/**
 单例

 @return 返回单例实例
 */
+ (instancetype _Nonnull)shareControllerManager;
//增加

/**
 增加item

 @param item 需要增加的item
 @param reply block
 */
- (void)addItem:(LGController * _Nonnull)item reply:(void(^ _Nonnull)(BOOL success, NSError * _Nullable error))reply;
//删除

/**
 删除item

 @param item 需要删除的item
 @param reply block
 */
- (void)removeItem:(LGController * _Nonnull)item reply:(void(^ _Nonnull)(BOOL success, NSError * _Nullable error))reply;
- (void)removeAllItem;
//编辑

/**
 编辑item

 @param item 需要编辑的item
 @param reply block
 */
- (void)editItem:(LGController *_Nonnull)item reply:(void(^ _Nonnull)(BOOL success, NSError * _Nullable error))reply;

/**
 设置门信息是否常用，如果该门是并非常用，则修改为常用门，反之，设置为不常用

 @param door 需要设置的门
 */
- (void)setFavoriteWith:(LGDoor * _Nonnull)door;
//查

/**
 是否存在某个item，注意：该方法以控制器的SN为准，若SN存在，则存在，SN不存在则不存在

 @param item 需要查找的item
 @return 返回是否存在
 */
- (BOOL)isExistsItem:(LGController *_Nonnull)item;

/**
 查找某个SN是否存在

 @param SN 需要查找的SN
 @return 返回是否存在
 */
- (BOOL)isExistsItemWithSN:(NSString *_Nonnull)SN;

/**
 根据字符串查找相关门

 @param text 用户输入的字符串
 @param reply block
 */
- (void)searchDoorWith:(NSString * _Nonnull)text reply:(void(^ _Nonnull)(NSArray <LGDoor *>* _Nullable resultArr))reply;

/**
 根据字符串查找相关门

 @param text 用户输入的字符串
 @param reply block resultArr：用户门数组 recommendArr：推荐门数组
 */
- (void)searchDoorWithAndRecommend:(NSString * _Nonnull)text reply:(void(^ _Nonnull)(NSArray <LGDoor *>* _Nullable resultArr,NSArray <LGDoor *>* _Nullable recommendArr))reply;

/**
 用于开门

 @param door 需要被打开的门
 @param reply block
 */
- (void)openDoor:(LGDoor * _Nonnull)door reply:(void(^_Nullable)(BOOL success ,NSError * _Nullable error))reply;

/**
 用于获取当前门的状态：打开 关闭 或者 无法连接（不在线）

 @param door 需要获取状态的门
 @param reply block
 */
- (void)getDoorState:(LGDoor * _Nonnull)door reply:(void(^_Nonnull)(BOOL open ,NSError * _Nullable error))reply;

///**
// 用于设置门是否常用  -1:不常用 0:默认 1:常用
//
// @param favorite 负数将设置门为不常用 正数表示常用 0表示默认
// */
//- (void)setDoor:(LGDoor *_Nonnull)door Favorite:(NSInteger)favorite;

/**
 用于设置门是否常用  -1:不常用 0:默认 1:常用

 @param door 需要设置的门
 @param favorite 负数将设置门为不常用 正数表示常用 0表示默认
 @param reply block:changedIndexPath为重新排序后的indexpath
 */
- (void)setDoor:(LGDoor *_Nonnull)door Favorite:(NSInteger)favorite reply:(void(^_Nullable)(NSIndexPath * _Nonnull changedIndexPath))reply;
@end

#pragma mark - 门禁控制器管理类

UIKIT_EXTERN NSNotificationName _Nonnull const CMItemChangedNotification;
UIKIT_EXTERN NSNotificationName _Nonnull const CMDeleteAllItemNotification;
UIKIT_EXTERN NSNotificationName _Nonnull const CMAddedItemNotification;
UIKIT_EXTERN NSNotificationName _Nonnull const CMDeleteItemNotification;
UIKIT_EXTERN NSNotificationName _Nonnull const CMEditItemNotification;

